//package com.thought.wxsession.utils;
//
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.fastjson.JSONObject;
//import com.thought.wxsession.data.ChatMsg;
//import com.thought.wxsession.data.Chatdata;
//import com.thought.wxsession.data.WxChatResp;
//import com.tencent.wework.Finance;
//import lombok.extern.slf4j.Slf4j;
//
//
//
////10000	参数错误，请求参数错误
////10001	网络错误，网络请求错误
////10002	数据解析失败
////10003	系统失败
////10004	密钥错误导致加密失败
////10005	fileid错误
////10006	解密失败
////10007 找不到消息加密版本的私钥，需要重新传入私钥对
////10008 解析encrypt_key出错
////10009 ip非法
////10010 数据过期
//
//@Slf4j
//public class Main {
//    public static void main(String[] args){
///**
// * 拉会话消息
// */
//
//
//        //使用sdk前需要初始化，初始化成功后的sdk可以一直使用。
//        //如需并发调用sdk，建议每个线程持有一个sdk实例。
//        log.info("加载企业微信sdk开始");
//        long sdk = Finance.NewSdk();
//        log.info("创建企业微信sdk成功:{}",sdk);
//        // 企业id
//        String corpid = "ww3b57911bdf0bf8e3";
//        // 管理凭证密钥 配置完公钥后 可以获取
//        String secret = "r90Z_DapY4ijRInUtAELljmbNk3yhpUUh7i7o8pM6ak";
//        // 私钥，与公钥为一对
//        String priKey = "-----BEGIN RSA PRIVATE KEY-----\n" +
//                "MIIEowIBAAKCAQEA1Ivjw1NQELGYxVYmXxwsDBiGR+vgJXrIPKu6IVGKU2JGR3aT\n" +
//                "wp2lsGXNn2OxDRiLAbOhqMfvhHD54kH+kjXhx62qNQ0W7okGuprCj0NZWHcSJZvc\n" +
//                "WHpUGNQSLY0jABpV/N0FxB3ECYlqY5cxVUReMmAxkl6qlYMZ1bbu+6D49MU/f7eL\n" +
//                "N4UqI0MQpF2blNyUFmkVe7F8/SoYWEqmPuEA6vg34JqPPdxnsGBnOJjvymhpb78G\n" +
//                "tNLXA0rploWjGnhPz8GKYScQOyPvLfR81k91GHQYHPcTml0pxtE29icRvdkRMQDM\n" +
//                "DNrIu52s/IBVVrK3je5nFxSIqM0yGJTl3i/ChQIDAQABAoIBABxTYFFBoyP2ZyO1\n" +
//                "bXuzZ3NdOVgQaVjVWiYrxKx4D3U5XaBcfyiqldBCYPri8E+Me8oIRH0X2CXQYJz0\n" +
//                "qpaVs7dGv64+RlYX0NvBkDhDg360r6hvcxgfhWGhsaJ8crOqztbaJdCTHvMeax1G\n" +
//                "ov54FA2moDSfhSBTznea35KNS2BjQuySd6wUyC4qt9eC5nu6A7NZPhFArG3GvCBR\n" +
//                "cU2HfOXj903ujd8g0wtATtLPVJSGxQcqs2QuWR9g9qBHiaN71Lta6IeYfpB132VI\n" +
//                "tqqSjKo/JDsz7tTdycTnBshkw0ypey//Yr2NT1eF4k60a5Fb89IUuO9uNe1CxM9R\n" +
//                "LUKArikCgYEA8/OuJkjlm/ER52KJuR12SU0Xb+RBqG42OcZ9AB5N5d613A0IAVJN\n" +
//                "WndlecAE2qSxW6yN6zeC/JYb08JyqzhmsvIXUPGVMomWEiAt26FACar72iSKyanW\n" +
//                "dSPtHXGAzTI030wRSx0yrX2AqV392IqhhX6/Qab4x7i84M5moqUdwIMCgYEA3wsl\n" +
//                "WXwfSLOpGbc5iNDXY8cfTuA5FlGKtJDRw3fWvgiocTnuAngN2EkAup0JV+vf7Q21\n" +
//                "Kkt9xjXIu2XNYxJjcSh5+3VI4KfAZkC2+q9AGQqFtgRggUE61K6XjJvvfrb/lxcZ\n" +
//                "R3Wp9MM078mxQmqm/1nLG7PIWqikc7K0BRfzclcCgYEAibg5yndA2KZhmyTv50eQ\n" +
//                "rZUN9CcCQhnmFvvNObHh/DGcrVvV9xkFflsFOJSEqQJs9foWLIIsOnhrwUJ3Bd5T\n" +
//                "bBZrv1CDEALIa/cqrGD+C/cxM1eJ2os8/OiJRiP7uNvtKVqCMMuM/pBpgDQFyKeK\n" +
//                "xBhn1KJ0tBvA1ZDwNEXO5A0CgYANC4DWt/y4atGUEHRL/TLrwgShv1l3ZbOAFgw+\n" +
//                "q26i1KzNWn8CI/VjVfm18GNQghopqiiTXbDwe8rOswiNJ9ErGBvySgzGHumQ0W4i\n" +
//                "QUe1bzkcySq/xInlUITKk4AxYBCYzKAM3uPezd/1uk0kvkogGydW6m/oZX6gya3f\n" +
//                "smPppwKBgC1mc6ozc/6OGXkIVsbCEhZvKyodPpp+DBzVNjJ/XwjNbGwFKTqeoBqe\n" +
//                "Bkc6MFGav3Ee7QVphvFjmzNP93qYZD5Cy206r0IDdpJb+V0O4YTTo8bq5gUGLyB2\n" +
//                "lWkfUlZj9xP/AV41R0J/qei664LKJGkmgsyD2vdRzB4YLV7JbvYW\n" +
//                "-----END RSA PRIVATE KEY-----\n";
//        // 公钥版本号，判断消息能否解密
//        Integer pubKeyVer = 7;
//
//        log.info("读取配置文件  corpid:{}  secret:{}  priKey:{}", corpid, secret, priKey);
//        Finance.Init(sdk, corpid, secret); // 初始化
//
//        // seq 表示该企业存档消息序号，该序号单调递增，拉取序号建议设置为上次拉取返回结果中最大序号。
//        // 首次拉取时seq传0，sdk会返回【有效期内】最早的消息。
//        int seq = 0; // 从指定的seq开始拉取消息，注意的是返回的消息从seq+1开始返回，seq为之前接口返回的最大seq值。首次使用请使用seq:0（这个值需要记录下来，以便下一次的拉去）
//        int limit = 1000;
//        //创建切片
//        long slice = Finance.NewSlice();
//        try {
//            //拉取聊天记录
//            long ret = Finance.GetChatData(sdk, seq, limit, null, null, 5, slice);
//            if (ret != 0) {
//                log.info("拉取聊天记录失败 ret:{}", ret);
//                return;
//            }
//            //获取切片中的内容
//            String contentFromSlice = Finance.GetContentFromSlice(slice);
//            WxChatResp wxChatResp = JSONObject.parseObject(contentFromSlice, WxChatResp.class);
//            log.info(seq + "，拉去的聊天记录密文结果：{}", JSONObject.toJSONString(wxChatResp));// 测试完成后去掉
//            JSONObject contentJsonObject = JSONObject.parseObject(contentFromSlice);
//
//            for (Chatdata chatdata : wxChatResp.getChatdata()) {
//                log.info("开始循环处理，{}", JSONObject.toJSONString(chatdata));
//                //公钥版本
//                Integer publicKeyVer = chatdata.getPublickeyVer();
//                if (ObjectUtil.notEqual(publicKeyVer, pubKeyVer)) {
//                    log.info("公钥版本不一致，无法解密当前消息，当前消息版本:{}   系统配置版本:{}", publicKeyVer, pubKeyVer);
//                    continue;
//                }
//                //加密密钥
//                String encryptRandomKey = chatdata.getEncryptRandomKey();
//                //加密聊天消息
//                String encryptChatMsg = chatdata.getEncryptChatMsg();
//                long msg = Finance.NewSlice();
//                try {
//                    // 获取加密密钥
//                    //String encryptKey = decryptByPrivateKey(priKey, encryptRandomKey);
//                    String encryptKey = RSAEncrypt.decryptRSA(encryptRandomKey, priKey);
//                    log.info("解析密文.企业微信自有解密内容");
//                    // 解析密文.企业微信自有解密内容
//                    ret = Finance.DecryptData(sdk, encryptKey, encryptChatMsg, msg);
//                    if (ret != 0) {
//                        log.info("解密聊天记录失败 ret ：{}", ret);
//                        continue;
//                    }
//                    // 获取切片中的内容
//                    String plaintext = Finance.GetContentFromSlice(msg);
//                    ChatMsg chatMsg = JSONObject.parseObject(plaintext, ChatMsg.class);
//                    log.info("解密结果：{}", JSONObject.toJSONString(chatMsg));
//                    // 释放slice
//                    Finance.FreeSlice(msg);
//                    JSONObject plaintextJson = JSONObject.parseObject(plaintext);
//                    // 文件类型  "text"文本 ,"revoke"撤回消息
//                    String msgtype = plaintextJson.getString("msgtype");
//                    if (StrUtil.equals(msgtype, "text")) {
//                        log.info("文本消息：{}", plaintextJson.getJSONObject("text").getString("content"));
//                    } else {
////                        if(StrUtil.equals(msgtype, "image")||StrUtil.equals(msgtype, "voice")){
//                        if (true) {
//                            SessionUtils sessionUtils = new SessionUtils();
//                            sessionUtils.setSdk(sdk);
//                            //sessionUtils.saveMessage(seq, JSONObject.toJSONString(plaintextJson));
//                        }
//
//                    }
//                    log.info("会话内容写入数据库 ，存储消息，类型，时间，userid，等信息  :{}", plaintextJson);
//                } catch (Exception e) {
//                    log.error("循环拉会话异常：e:{}", e);
//                }
//            }
//        } catch (Exception e) {
//            log.error("拉会话消息异常：e:{}", e);
//        } finally {
//            // 释放slice
//            Finance.FreeSlice(slice);
//        }
//    }
//}
